package com.drama.util;


import cn.hutool.core.codec.Base64;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import com.drama.api.base.RedisUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;

import java.util.HashMap;

/**
* @ClassName MpcUtils
* @Author HandsomeBugs
* @Date 2023/11/22
* @Description 华为云AI 调用
* @version 1.0
*/
@Slf4j
public class MpcUtils {

    private static String MPC_IAM_ACCOUNT="yujuyi"; //IAM用户信息 账号
    private static String MPC_IAM_USER="admin1"; //IAM用户信息 登录账号
    private static String MPC_IAM_PASSWORD="pjj19932271"; //IAM用户信息 登录密码
    private static String MPC_PROJECT_ID="1f88132844164b64ba133e0931c1eeec";//项目ID
    private static String MPC_REDIS_NAME="MPC-SUBJECT-TOKEN"; //存redis 名称
    private static String OBS_BARREL_NAME="yujuyi"; //桶名

    private static Integer MPC_TRANS_TEMPLATE_ID=899549; //转码模板ID
    private static String MPC_TOKEN_URL="https://iam.cn-north-4.myhuaweicloud.com/v3/auth/tokens"; //获取TOKEN地址
    private static String MPC_TRANSCODING_TASK_URL="https://mpc.cn-north-4.myhuaweicloud.com/v1/1f88132844164b64ba133e0931c1eeec/transcodings"; //创建转码任务


    @Autowired
    RedisUtils redisUtils;


    public static void main(String[] args) {

        String s="{\"signature\":\"v/2/fHh0nq1UagpovdVvfdAVckoOzqKQhHe1unnyKzQWvRxbdYLjC4KP19ufEDJlwse3zUVEnUICOr9hSlI+glCyoaXzr7/wGDq1yAhbJ/ITtXFNxrPDhpoLVAEUMBMclou/SpjHxO3paItonRabstvZoIWmpklxezivhH/s7Fv/woq2zZuYGk07y+ucWzuZ//HW2V2nt9Dp4AP6Bhb8hM9Ii3CTWRvr1bq/mZjVyV9JMn6tgP1X6k0h6wTzKyMd/UDRsHxDgMpvyO6HbysCUzqkDLsr8Q5UPfrvUMy3x4MhlQPfgSJWvH3RNjQfQ9vHA4M78kSaJNBk4/2OUP7uUA==\",\"subject\":\"TranscodeComplete\",\"topic_urn\":\"urn:smn:cn-north-4:1f88132844164b64ba133e0931c1eeec:video_zhuan\",\"message_id\":\"e5de80b374404ca5816cd35605f55e5a\",\"signature_version\":\"v1\",\"type\":\"Notification\",\"message\":\"{\\\"event_type\\\":\\\"TranscodeComplete\\\",\\\"transcode_info\\\":{\\\"task_id\\\":\\\"147080868\\\",\\\"status\\\":\\\"SUCCEEDED\\\",\\\"create_time\\\":\\\"20231123155347\\\",\\\"start_time\\\":\\\"20231123155347\\\",\\\"end_time\\\":\\\"20231123155719\\\",\\\"input\\\":{\\\"bucket\\\":\\\"yujuyi\\\",\\\"location\\\":\\\"cn-north-4\\\",\\\"object\\\":\\\"history/1721071054825062400/20231123_天选神婿 第1集_H.264_1080x1920_AAC_2100.mp4\\\"},\\\"output\\\":{\\\"bucket\\\":\\\"yujuyi\\\",\\\"location\\\":\\\"cn-north-4\\\",\\\"object\\\":\\\"video/1721071054825062400\\\"},\\\"error_code\\\":\\\"MPC.10218\\\",\\\"description\\\":\\\"任务处理成功。\\\",\\\"media_detail\\\":{\\\"features\\\":[\\\"TRANSCODE\\\"],\\\"origin_para\\\":{\\\"duration\\\":74,\\\"duration_ms\\\":74544,\\\"file_format\\\":\\\"MOV,MP4,M4A,3GP,3G2,MJ2\\\",\\\"video\\\":{\\\"width\\\":1080,\\\"height\\\":1920,\\\"bitrate\\\":2083,\\\"bitrate_bps\\\":2083000,\\\"frame_rate\\\":60,\\\"codec\\\":\\\"H264\\\",\\\"peak_bitrate\\\":0},\\\"audio\\\":{\\\"codec\\\":\\\"AAC\\\",\\\"sample\\\":48000,\\\"channels\\\":2,\\\"sky_switch\\\":0,\\\"bitrate\\\":317,\\\"bitrate_bps\\\":317000,\\\"file_size\\\":0,\\\"embed_video\\\":0}},\\\"output_video_paras\\\":[{\\\"template_id\\\":899549,\\\"size\\\":21781,\\\"size_byte\\\":22303898,\\\"pack\\\":\\\"MP4\\\",\\\"video\\\":{\\\"width\\\":1080,\\\"height\\\":1920,\\\"bitrate\\\":2065,\\\"bitrate_bps\\\":2065646,\\\"frame_rate\\\":60,\\\"codec\\\":\\\"H264\\\",\\\"dynamic_range\\\":\\\"SDR\\\",\\\"peak_bitrate\\\":0},\\\"audio\\\":{\\\"codec\\\":\\\"AAC\\\",\\\"sample\\\":48000,\\\"channels\\\":2,\\\"sky_switch\\\":0,\\\"bitrate\\\":317,\\\"bitrate_bps\\\":317012,\\\"file_size\\\":0,\\\"embed_video\\\":0},\\\"audios\\\":[],\\\"file_name\\\":\\\"1727692043402137600.mp4\\\",\\\"conver_duration\\\":222.0}]}}}\",\"unsubscribe_url\":\"https://console.huaweicloud.com/smn/subscription/unsubscribe?region=cn-north-4&region_id=cn-north-4&subscription_urn=urn:smn:cn-north-4:1f88132844164b64ba133e0931c1eeec:video_zhuan:7e528531a485442e95b3262a5290624e\",\"signing_cert_url\":\"https://smn.cn-north-4.myhuaweicloud.com/smn/SMN_cn-north-4_b98100ca131b4116ab8ee7ccedbaae99.pem\",\"timestamp\":\"2023-11-23T15:57:21Z\"}";

        JSONObject jsonObject=new JSONObject(s);
        log.info(jsonObject.toString());
        log.info(jsonObject.getJSONObject("message").toString());
        log.info(jsonObject.getJSONObject("message").getJSONObject("transcode_info").toString());
        log.info(jsonObject.getJSONObject("message").getJSONObject("transcode_info").getStr("task_id"));
        log.info(jsonObject.getJSONObject("message").getJSONObject("transcode_info").getStr("status"));
        log.info(jsonObject.getJSONObject("message").getJSONObject("transcode_info").getJSONObject("output").getStr("object"));
        log.info(jsonObject.getJSONObject("message").getJSONObject("transcode_info").getJSONObject("media_detail").getJSONArray("output_video_paras").getJSONObject(0).getStr("file_name"));
        log.info(jsonObject.getJSONObject("message").getJSONObject("transcode_info").getJSONObject("media_detail").getJSONArray("output_video_paras").getJSONObject(0).getStr("file_name"));
        log.info(jsonObject.getJSONObject("message").getJSONObject("transcode_info").getJSONObject("media_detail").getJSONArray("output_video_paras").getJSONObject(0).getJSONObject("video").getStr("bitrate"));


//        System.out.println(Base64.encode("备案号："+"2222222223213").toString());
//        CreateTranscodingTask("history/1721071054825062400/20231123_天选神婿 第1集_H.264_1080x1920_AAC_2100.mp4","video/1721071054825062400","1721152654703312896"+".mp4","2023213213131231");
//        getTranscoding(146720798);

    }



    /**
     * 获取用户Token
     * @return 获取ID
     */
    public static String getUserToken(){
        try{
            JSONObject userObject=new JSONObject();
            userObject.putOnce("domain",new JSONObject().putOnce("name",MPC_IAM_ACCOUNT));
            userObject.putOnce("name",MPC_IAM_USER);
            userObject.putOnce("password",MPC_IAM_PASSWORD);
            JSONObject identityJSON=new JSONObject();
            identityJSON.putOnce("methods",new JSONArray().put("password"));
            identityJSON.putOnce("password",new JSONObject().putOnce("user",userObject));
            JSONObject scopeJSON=new JSONObject();
            scopeJSON.putOnce("domain",new JSONObject());
            scopeJSON.putOnce("project",new JSONObject().putOnce("id",MPC_PROJECT_ID));
            JSONObject authJSON=new JSONObject().putOnce("identity",identityJSON).putOnce("scope",scopeJSON);
            ResponseEntity responseEntity= RestTemplateUtils.post(MPC_TOKEN_URL,new JSONObject().putOnce("auth",authJSON).toString(),JSONObject.class);
            log.info("responseEntity Body:::::"+responseEntity.getBody());
            log.info("responseEntity Heard:::::"+responseEntity.getHeaders());
            log.info("responseEntity Heard-token:::::"+responseEntity.getHeaders().get("X-Subject-Token").get(0));
            String token=responseEntity.getHeaders().get("X-Subject-Token").get(0);
            return token;
        }catch (Exception e){
            return "";
        }
    }

    /**
     * 查询转码
     */

    public static void getTranscoding(Integer task_id){
        String url=MPC_TRANSCODING_TASK_URL+"?task_id="+task_id;
        HashMap<String, String> headers=new HashMap<>();
        headers.put("X-Auth-Token",getUserToken());
        ResponseEntity responseEntity= RestTemplateUtils.get(url,headers,JSONObject.class);
        log.info("responseEntity Body:::::"+responseEntity.getBody());
        JSONObject result= (JSONObject) responseEntity.getBody();
        JSONArray  taskArray=result.getJSONArray("task_array");
        if(taskArray==null){
            return;
        }
        JSONObject taskJSON=taskArray.getJSONObject(0);
        String status=taskJSON.getStr("status");
        String endTime=taskJSON.getStr("end_time");
        String size=taskJSON.getJSONObject("transcode_detail").getJSONArray("multitask_info").getJSONObject(0).getJSONObject("output_file").getStr("size");
        log.info(status);
        log.info(size);
    }

    public static String CreateTranscodingTask(String inputPath,String outPath,String outName){
        try {
            JSONObject inputJSON=new JSONObject();
            inputJSON.putOnce("bucket",OBS_BARREL_NAME);//OBS的bucket名称
            inputJSON.putOnce("location","cn-north-4");//OBS桶所在的区域,且必须与使用的MPC区域保持一致。
//            inputJSON.putOnce("object","/video/history/888888/202311/天选神婿 第1集.mp4");//当用于指示input时,需要指定到具体对象。
            inputJSON.putOnce("object",inputPath);//当用于指示input时,需要指定到具体对象。
            JSONObject outputJSON=new JSONObject();
            outputJSON.putOnce("bucket","yujuyi");//OBS的bucket名称
            outputJSON.putOnce("location","cn-north-4");//OBS桶所在的区域,且必须与使用的MPC区域保持一致。
//            outputJSON.putOnce("object","/video/access/888888/202311/");//当用于指示output时, 只需指定到转码结果期望存放的路径。
            outputJSON.putOnce("object",outPath);//当用于指示output时, 只需指定到转码结果期望存放的路径。

            JSONObject paramJSON=new JSONObject();
            paramJSON.putOnce("input",inputJSON);
            paramJSON.putOnce("output",outputJSON);
            paramJSON.putOnce("output_filenames",new JSONArray().put(outName));
            paramJSON.putOnce("trans_template_id",new JSONArray().put(MPC_TRANS_TEMPLATE_ID));
            HashMap<String, String> headers=new HashMap<>();
            headers.put("X-Auth-Token",getUserToken());
            ResponseEntity responseEntity= RestTemplateUtils.post(MPC_TRANSCODING_TASK_URL,headers,paramJSON,JSONObject.class);
            log.info(responseEntity.getBody().toString());
            JSONObject jsonObject=(JSONObject)responseEntity.getBody();
            if(jsonObject.containsKey("task_id")){
                return jsonObject.getStr("task_id");
            }
            return "";
        }catch (Exception e){
            return "";
        }
    }
    /**
     *
     * @param inputPath 视频桶路径
     * @param outPath 视频输出路径
     * @param outName 视频输出名称
     * @param waterMarkName
     * @return
     */
    public static String CreateTranscodingTask(String inputPath,String outPath,String outName,String waterMarkName){
        try {
            JSONObject inputJSON=new JSONObject();
            inputJSON.putOnce("bucket",OBS_BARREL_NAME);//OBS的bucket名称
            inputJSON.putOnce("location","cn-north-4");//OBS桶所在的区域,且必须与使用的MPC区域保持一致。
//            inputJSON.putOnce("object","/video/history/888888/202311/天选神婿 第1集.mp4");//当用于指示input时,需要指定到具体对象。
            inputJSON.putOnce("object",inputPath);//当用于指示input时,需要指定到具体对象。
            JSONObject outputJSON=new JSONObject();
            outputJSON.putOnce("bucket","yujuyi");//OBS的bucket名称
            outputJSON.putOnce("location","cn-north-4");//OBS桶所在的区域,且必须与使用的MPC区域保持一致。
//            outputJSON.putOnce("object","/video/access/888888/202311/");//当用于指示output时, 只需指定到转码结果期望存放的路径。
            outputJSON.putOnce("object",outPath);//当用于指示output时, 只需指定到转码结果期望存放的路径。

            //设置文字水印配置
            JSONObject watermarksJSON=new JSONObject();
            watermarksJSON.putOnce("text_context", Base64.encode("备案号："+waterMarkName));
            JSONObject textWatermarkJSON=new JSONObject();
            textWatermarkJSON.putOnce("dx","30");//水印图片起点相对输出视频顶点的水平偏移量。
            textWatermarkJSON.putOnce("dy","60");//水印图片起点相对输出视频顶点的垂直偏移量。
            textWatermarkJSON.putOnce("referpos","BottomRight");//水印的位置。TopRight：右上角。 TopLeft：左上角 BottomRight：右下角。BottomLeft：左下角。
            textWatermarkJSON.putOnce("timeline_start","0");//水印开始时间，与“timeline_duration”配合使用。
            textWatermarkJSON.putOnce("timeline_duration","5");//水印持续时间，与“timeline_start”配合使用。
            textWatermarkJSON.putOnce("font_name","fzyouh");//字体，当前支持fzyouh
            textWatermarkJSON.putOnce("font_size","40"); //字体大小。 取值范围：[4, 120]
            textWatermarkJSON.putOnce("font_color","white");//字体颜色。 目前颜色支持 black，blue，white，green，red，yellow，brown，gold，pink，orange，purple。
            textWatermarkJSON.putOnce("base","output");//水印叠加母体 取值如下：input：水印叠加在输入片源上，转码输出后实际大小按图像等比例缩放 output：水印叠加在转码输出文件上。
            watermarksJSON.putOnce("text_watermark",textWatermarkJSON);

            JSONObject paramJSON=new JSONObject();
            paramJSON.putOnce("input",inputJSON);
            paramJSON.putOnce("output",outputJSON);
            paramJSON.putOnce("output_filenames",new JSONArray().put(outName));
            paramJSON.putOnce("trans_template_id",new JSONArray().put(MPC_TRANS_TEMPLATE_ID));
            paramJSON.putOnce("watermarks",new JSONArray().put(watermarksJSON));
            HashMap<String, String> headers=new HashMap<>();
            headers.put("X-Auth-Token",getUserToken());
            ResponseEntity responseEntity= RestTemplateUtils.post(MPC_TRANSCODING_TASK_URL,headers,paramJSON,JSONObject.class);
            log.info(responseEntity.getBody().toString());
            JSONObject jsonObject=(JSONObject)responseEntity.getBody();
            if(jsonObject.containsKey("task_id")){
                return jsonObject.getStr("task_id");
            }
            return "";
        }catch (Exception e){
            return "";
        }
    }




}
